package pe.com.hermes.hermetic.web.controller.configuracion;

import pe.com.hermes.hermetic.beans.AuditBean;
import pe.com.hermes.hermetic.beans.ClaveBean;
import pe.com.hermes.hermetic.negocio.service.HermeticFacade;
import pe.com.hermes.hermetic.web.controller.base.IController;
import pe.com.hermes.hermetic.web.forms.HMF2002Form;
import pe.com.hermes.hermetic.negocio.ultil.ConstantesHermetic;
import pe.com.hermes.hermetic.negocio.ultil.Util;


import pe.com.hermes.hermetic.web.controller.base.IWebOpciones;

import java.text.SimpleDateFormat;

import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;


@RequestMapping("/mostrarHWF2002.html")
@SessionAttributes(value={"codOpci","desOpci"})
@Controller
public class ClavePedidosController implements IController{
    private Logger logger = Logger.getLogger(this.getClass());
    @Autowired
    private HermeticFacade servicioHermetic;
    
    @RequestMapping(method={RequestMethod.GET})
    protected String showForm(ModelMap model, HttpServletRequest request) throws Exception {

        HttpSession session = request.getSession(false);        
        if (session.getAttribute("usuario") == null)
            return FORM_SESSION_FINISH;

        List listaTransacciones = (List)session.getAttribute("listaMenu4");
        if (!Util.validaAccesoOpcion(listaTransacciones, 
                                     ConstantesHermetic.CONFIG_CLAVE_PEDIDOS)) {
            return FORM_ACCESS_NULL_VIEW;
        }

        String cliente = (String)session.getAttribute("cliente");
        String sucursal = (String)session.getAttribute("sucursal");
        HMF2002Form form = new HMF2002Form();
        form.setControl(ConstantesHermetic.CTE_CONTROL_ACTIVO);
        try {

            List listadoClaves = servicioHermetic.getListadoClaves(cliente);
            if (listadoClaves != null) {
                //request.setAttribute("listadoClaves", listadoClaves);
                model.put("listadoClaves", listadoClaves);
            }
            String codOpci = IWebOpciones.CLAVE_PEDI;
            String desOpci = servicioHermetic.getDesOpci(codOpci, request);
            model.put("codOpci",codOpci);
            model.put("desOpci",desOpci);
            model.put(FORM_KEY,form);                        
            AuditBean auditBean = new AuditBean(CLAVE_PEDI);
            servicioHermetic.inseAudit(auditBean);
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("Error en el proceso. "+ e);
            return FORM_ERROR_VIEW;
        }

        return FORM_CONF_CLAVE_PEDI_ACCE_VIEW;
    }

    @RequestMapping(params={"accion=autenticar"})
    private String autenticar (ModelMap model,@ModelAttribute(FORM_KEY) HMF2002Form form, BindingResult result, HttpServletRequest request) throws Exception {    
    
        HttpSession session = request.getSession(false);        
        if (session.getAttribute("usuario") == null)
            return FORM_SESSION_FINISH;

        List listaTransacciones = (List)session.getAttribute("listaMenu4");
        if (!Util.validaAccesoOpcion(listaTransacciones, 
                                     ConstantesHermetic.CONFIG_CLAVE_PEDIDOS)) {
            return FORM_ACCESS_NULL_VIEW;
        }       
                
        //Limpieza de parametros de entrada        
        form.setControl(ConstantesHermetic.CTE_CONTROL_ACTIVO);
        form.setPassword(Util.limpiarSQLInjection(form.getPassword()));
        //Fin de Limpieza de parametros de entrada
         try {
             String password = Util.getUser().getPassword();
             String[] password3 = Util.desenmascarar(password);
             model.put(FORM_KEY,form);
             if(!form.getPassword().equals(password3[0])){
                 result.addError((new FieldError(FORM_KEY,"mensaje",1,false , new String[] {"error.baduser.noacceso"}, new String[] {}, "")));
                 return FORM_CONF_CLAVE_PEDI_ACCE_VIEW;
             }
         }
         catch (Exception e) {
             logger.error(e);
         }
        /*
        AdminSeguridad seguridad = new AdminSeguridadImpl();
        UsuarioWebBean usuario = null;

        ActionErrors errors = new ActionErrors();
        try {
            usuario = seguridad.autenticarUsuario(request.getSession().getAttribute("usuario").toString(), 
                                                form.getPassword(), 
                                                request.getSession().getAttribute("empresa").toString());

            form.setPassword("");
            //form = null;

            if (usuario.getCodModulo() == null) { 
                //errors.add("HMF2002Acceso", new ActionError("error.baduser.noacceso"));
                result.addError((new FieldError(FORM_KEY,"mensaje",1,false , new String[] {"error.baduser.noacceso"}, new String[] {}, "")));
                //System.out.println(errors.get("HMF2002Acceso"));                
                return FORM_CONF_CLAVE_PEDI_ACCE_VIEW;
            }
    
            model.put(FORM_KEY,form);

        } catch (Exception e) {
            e.printStackTrace();
        }
        */
        return FORM_CONF_CLAVE_PEDI_VIEW;
    }
    
    @RequestMapping(params={"accion=nuevo"})
    private String nuevo (ModelMap model,@ModelAttribute(FORM_KEY) HMF2002Form form, BindingResult result, HttpServletRequest request) throws Exception {    
    
        HttpSession session = request.getSession(false);        
        if (session.getAttribute("usuario") == null)
            return FORM_SESSION_FINISH;

        List listaTransacciones = (List)session.getAttribute("listaMenu4");
        if (!Util.validaAccesoOpcion(listaTransacciones, 
                                     ConstantesHermetic.CONFIG_CLAVE_PEDIDOS)) {
            return FORM_ACCESS_NULL_VIEW;
        }       
                
        //Limpieza de parametros de entrada        
        form.setControl(ConstantesHermetic.CTE_CONTROL_ACTIVO);

        try {
            int accionMapa = 1;
            form.setFechaIni(null);
            form.setFechaFin(null);
            form.setClave(null);
            form.setTipoAccion("N");
    
            model.put(FORM_KEY,form);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return FORM_CONF_CLAVE_PEDI_MODI_VIEW;
    }    

    @RequestMapping(params={"accion=grabar"})
    private String grabar (ModelMap model,@ModelAttribute(FORM_KEY) HMF2002Form form, BindingResult result, HttpServletRequest request) throws Exception {    
    
        HttpSession session = request.getSession(false);        
        if (session.getAttribute("usuario") == null)
            return FORM_SESSION_FINISH;

        List listaTransacciones = (List)session.getAttribute("listaMenu4");
        if (!Util.validaAccesoOpcion(listaTransacciones, 
                                     ConstantesHermetic.CONFIG_CLAVE_PEDIDOS)) {
            return FORM_ACCESS_NULL_VIEW;
        }       
                
        //int accionMapa = 2;
        form.setControl(ConstantesHermetic.CTE_CONTROL_ACTIVO);
        
        try{
        
        String tipoAccion = form.getTipoAccion();

        String cliente = (String)request.getSession().getAttribute("cliente");
        String sucursal = 
            (String)request.getSession().getAttribute("sucursal");
        String usuario = (String)request.getSession().getAttribute("usuario");

        String fecIni = form.getFechaIni();
        String fecFin = form.getFechaFin();
        String clave = form.getClave();
        try {

            /**** Modificado 20090116 JCR *****/
            //valido la longitud de la clave ingresada

            /**** Modificado 20090116 JCR *****/

            if (tipoAccion.equals("N")) {
                if (servicioHermetic.getCantidadClaves(fecIni, 
                                                             cliente) >= 0 && 
                    servicioHermetic.getCantidadClaves(fecFin, 
                                                             cliente) >= 0) {
                    if (fecIni.equals(fecFin)) {
                        //elimina y graba la clave para un solo dia
                        if (servicioHermetic.getExisteClave(fecIni, 
                                                                  cliente) == 
                            1) {
                            ClaveBean datos = new ClaveBean();
                            datos.setCodCliente(cliente);
                            datos.setFechaInicio(fecIni);
                            datos.setFechaFinal(fecFin);
                            servicioHermetic.eliminaClave(datos);
                        }
                        ClaveBean datos = new ClaveBean();
                        datos.setClave(clave);
                        datos.setCodCliente(cliente);
                        datos.setFechaInicio(fecIni);
                        datos.setFechaFinal(fecFin);
                        datos.setUsuarioCreaWeb(usuario);
                        servicioHermetic.insertarClave(datos);
                    } else {
                        /**** Modificado 20090116 JCR *****/
                        //elimina y graba la misma clave para un rango de dias, 
                        SimpleDateFormat formatoDia = 
                            new SimpleDateFormat("dd/MM/yyyy");
                        //String to DATE        
                        Date dateIni = formatoDia.parse(fecIni);
                        Date dateFin = formatoDia.parse(fecFin);
                        Calendar calendarIni = Calendar.getInstance();
                        Calendar calendarFin = Calendar.getInstance();
                        //Date to Calendar
                        calendarIni.setTime(dateIni);
                        calendarFin.setTime(dateFin);
                        String diaProceso = null;
                        do {
                            diaProceso = 
                                    formatoDia.format(calendarIni.getTime());

                            if (servicioHermetic.getExisteClave(diaProceso, 
                                                                      cliente) == 
                                1) {
                                ClaveBean datos = new ClaveBean();
                                datos.setCodCliente(cliente);
                                datos.setFechaInicio(diaProceso);
                                datos.setFechaFinal(diaProceso);
                                servicioHermetic.eliminaClave(datos);
                            }
                            ClaveBean datos = new ClaveBean();
                            datos.setClave(clave);
                            datos.setCodCliente(cliente);
                            datos.setFechaInicio(diaProceso);
                            datos.setFechaFinal(diaProceso);
                            datos.setUsuarioCreaWeb(usuario);
                            servicioHermetic.insertarClave(datos);

                            System.out.println("GENERO CLAVE PARA EL DIA: " + 
                                               diaProceso);

                            //SUMA 1 dia a Calendar
                            calendarIni.add(Calendar.DATE, 1);

                        } while (calendarIni.before(calendarFin) || 
                                 calendarIni.equals(calendarFin));
                        /**** Modificado 20090116 JCR *****/

                        /*ResultSet rs = null;
                        rs = servicioHermetic.getFechaClave(fecIni, fecFin, sucursal);
                        while (rs.next()) {
                            if (servicioHermetic.getExisteClave(rs.getString("fec_cale"), cliente) == 1) {
                                ClaveBean datos = new ClaveBean();
                                datos.setCodCliente(cliente);
                                datos.setFechaInicio(fecIni);
                                datos.setFechaFinal(fecFin);
                                servicioHermetic.eliminaClave(datos);
                            }
                                ClaveBean datos = new ClaveBean();
                                datos.setClave(clave);
                                datos.setCodCliente(cliente);
                                datos.setFechaInicio(rs.getString("fec_cale"));
                                datos.setFechaFinal(rs.getString("fec_cale"));
                                datos.setUsuarioCreaWeb(usuario);
                                servicioHermetic.insertarClave(datos);
                        }
                        */
                    }
                }
            } else {
                ClaveBean datos = new ClaveBean();
                datos.setClave(clave);
                datos.setCodCliente(cliente);
                datos.setFechaInicio(fecIni);
                datos.setFechaFinal(fecFin);
                datos.setUsuarioModiWeb(usuario);
                servicioHermetic.actualizaClave(datos);
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

        List listadoClaves = null;
        listadoClaves = servicioHermetic.getListadoClaves(cliente);
        if (listadoClaves != null) {
            //request.setAttribute("listadoClaves", listadoClaves);
            model.put("listadoClaves", listadoClaves);
        }
        
        //errors.add("subgrupo", new ActionError("accion.ok.graboclave"));
        result.addError((new FieldError(FORM_KEY,"mensaje",1,false , new String[] {"accion.ok.graboclave"}, new String[] {}, "")));
                   
        model.put(FORM_KEY,form);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return FORM_CONF_CLAVE_PEDI_VIEW;
    }
    
    @RequestMapping(params={"accion=modificar"})
    private String modificar (ModelMap model,@ModelAttribute(FORM_KEY) HMF2002Form form, BindingResult result, HttpServletRequest request) throws Exception {    
    
        HttpSession session = request.getSession(false);        
        if (session.getAttribute("usuario") == null)
            return FORM_SESSION_FINISH;

        List listaTransacciones = (List)session.getAttribute("listaMenu4");
        if (!Util.validaAccesoOpcion(listaTransacciones, 
                                     ConstantesHermetic.CONFIG_CLAVE_PEDIDOS)) {
            return FORM_ACCESS_NULL_VIEW;
        }       
                
        //Limpieza de parametros de entrada        
        form.setControl(ConstantesHermetic.CTE_CONTROL_ACTIVO);
 
        //int accionMapa = 1;
        try {            

            form.setFechaIni(request.getParameter("chk"));
            form.setFechaFin(request.getParameter("chk"));
            form.setClave(null);
            form.setTipoAccion("M");
    
            //errors.add("subgrupo", new ActionError("accion.ok.modificoclave"));    
            result.addError((new FieldError(FORM_KEY,"mensaje",1,false , new String[] {"accion.ok.modificoclave"}, new String[] {}, "")));

    
            model.put(FORM_KEY,form);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return FORM_CONF_CLAVE_PEDI_MODI_VIEW;
    }
    
    @RequestMapping(params={"accion=eliminar"})
    private String eliminar (ModelMap model,@ModelAttribute(FORM_KEY) HMF2002Form form, BindingResult result, HttpServletRequest request) throws Exception {    
    
        HttpSession session = request.getSession(false);        
        if (session.getAttribute("usuario") == null)
            return FORM_SESSION_FINISH;

        List listaTransacciones = (List)session.getAttribute("listaMenu4");
        if (!Util.validaAccesoOpcion(listaTransacciones, 
                                     ConstantesHermetic.CONFIG_CLAVE_PEDIDOS)) {
            return FORM_ACCESS_NULL_VIEW;
        }       
                
        //Limpieza de parametros de entrada        
        form.setControl(ConstantesHermetic.CTE_CONTROL_ACTIVO);
        
        //int accionMapa = 2;
        try {

            String cliente = (String)request.getSession().getAttribute("cliente");
            try {

                /**** Modificado 20090116 JCR *****/

                String[] checkElimina = request.getParameterValues("chk");
                int tamanoCheck = checkElimina.length;
                ClaveBean datos = null;
                for (int idx = 0; idx < tamanoCheck; idx++) {
                    datos = new ClaveBean();
                    datos.setCodCliente(cliente);
                    datos.setFechaInicio(checkElimina[idx]);
                    datos.setFechaFinal(checkElimina[idx]);
                    servicioHermetic.eliminaClave(datos);
                }
                /**** Modificado 20090116 JCR *****/
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }

            List listadoClaves = servicioHermetic.getListadoClaves(cliente);
            if (listadoClaves != null) {
                //request.setAttribute("listadoClaves", listadoClaves);
                model.put("listadoClaves", listadoClaves);
            }
    
            //errors.add("subgrupo", new ActionError("accion.ok.eliminoclave"));    
            result.addError((new FieldError(FORM_KEY,"mensaje",1,false , new String[] {"accion.ok.eliminoclave"}, new String[] {}, "")));
    
            model.put(FORM_KEY,form);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return FORM_CONF_CLAVE_PEDI_VIEW;
    }
    
    @RequestMapping(params={"accion=cancelar"})
    private String cancelar (ModelMap model,@ModelAttribute(FORM_KEY) HMF2002Form form, BindingResult result, HttpServletRequest request) throws Exception {    
    
        HttpSession session = request.getSession(false);        
        if (session.getAttribute("usuario") == null)
            return FORM_SESSION_FINISH;

        List listaTransacciones = (List)session.getAttribute("listaMenu4");
        if (!Util.validaAccesoOpcion(listaTransacciones, 
                                     ConstantesHermetic.CONFIG_CLAVE_PEDIDOS)) {
            return FORM_ACCESS_NULL_VIEW;
        }       
                
        //Limpieza de parametros de entrada        
        form.setControl(ConstantesHermetic.CTE_CONTROL_ACTIVO);
        
        //int accionMapa = 2;
        
        try {

            String cliente = (String)request.getSession().getAttribute("cliente");

            List listadoClaves = servicioHermetic.getListadoClaves(cliente);
            if (listadoClaves != null) {
                //request.setAttribute("listadoClaves", listadoClaves);
                model.put("listadoClaves", listadoClaves);
            }
    
            model.put(FORM_KEY,form);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return FORM_CONF_CLAVE_PEDI_VIEW;
    }    
}
